package com.lzq.mq.common.coder;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

public class TcpMsgDecoder extends ByteToMessageDecoder {
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {

        // 防止粘包拆包, 伪造消息
        if (byteBuf.readableBytes() < TcpMsg.HEADER_LENGTH || byteBuf.readShort() != TcpMsg.magic) {
            channelHandlerContext.close();
            return;
        }

        int code = byteBuf.readInt();
        int len = byteBuf.readInt();

        /*
          byteBuf的read方法会移动游标
          两次调用readableBytes, 第一次是从头开始的长度, 第二次是从len字节后开始长度
         */
        if (byteBuf.readableBytes() < len) {
            // 消息不完整
            channelHandlerContext.close();
            return;
        }

        // 读取消息体, 构建TcpMsg对象
        byte[] body = new byte[len];
        byteBuf.readBytes(body);
        TcpMsg tcpMsg = new TcpMsg(code, body);

        // 添加到list中, 交由handler处理
        list.add(tcpMsg);
    }
}
